# encoding: utf-8
# 项目名称： 常用设计模式
# @File  : 006-建造者模式.py
# @Author: sun hao
# @Desc :
# @Date  :   15:18 2024/10/29

from abc import ABCMeta, abstractmethod


# 定义一个玩家类，包含玩家的各个部位属性
class Player:
    def __init__(self, face=None, body=None, arm=None, leg=None):
        # 初始化玩家的身体部位
        self.face = face
        self.body = body
        self.arm = arm
        self.leg = leg

    def __str__(self):
        # 返回玩家的身体部位信息，方便打印输出
        return f'{self.face},{self.body},{self.arm},{self.leg}'


# 定义一个抽象的建造者类，规定了所有具体建造者必须实现的方法
class PlayerBuilder(metaclass=ABCMeta):
    @abstractmethod
    def build_face(self):
        pass

    @abstractmethod
    def build_body(self):
        pass

    @abstractmethod
    def build_arm(self):
        pass

    @abstractmethod
    def build_leg(self):
        pass


# 具体建造者类 - 创建美女
class SexyGrilBuilder(PlayerBuilder):
    def __init__(self):
        # 每个具体的建造者类都需要创建一个Player实例
        self.player = Player()

    def build_face(self):
        # 设置美女的脸型
        self.player.face = "鹅蛋脸"

    def build_body(self):
        # 设置美女的身体特征
        self.player.body = "身材苗条"

    def build_arm(self):
        # 设置美女的手臂特征
        self.player.arm = "胳膊纤细"

    def build_leg(self):
        # 设置美女的腿部特征
        self.player.leg = "大长腿"


# 具体建造者类 - 创建野兽
class Monster(PlayerBuilder):
    def __init__(self):
        # 同样地，创建一个Player实例用于构建野兽对象
        self.player = Player()

    def build_face(self):
        # 设置野兽的脸型
        self.player.face = "国字脸"

    def build_body(self):
        # 设置野兽的身体特征
        self.player.body = "身材魁梧"

    def build_arm(self):
        # 设置野兽的手臂特征
        self.player.arm = "胳膊粗壮"

    def build_leg(self):
        # 设置野兽的腿部特征
        self.player.leg = "大长腿"


# 控制器类，负责调用具体的建造者来构建玩家对象
class PlayerDirector:
    def build_player(self, builder):
        # 调用具体的建造者方法，按特定顺序构建玩家对象的不同部位
        builder.build_body()
        builder.build_face()
        builder.build_arm()
        builder.build_leg()
        # 构建完成后返回完整的玩家对象
        return builder.player


# 客户端代码
builder = Monster()  # 创建一个野兽建造者对象
director = PlayerDirector()  # 创建一个导演对象
p = director.build_player(builder)  # 导演指挥建造者构建玩家对象
print(p)  # 输出构建好的玩家对象的信息
